package com.example.no1admin.service.impl;

import com.example.no1admin.ex.ServiceException;
import com.example.no1admin.mapper.AlbumMapper;
import com.example.no1admin.pojo.dto.album.AlbumAddNewDTO;
import com.example.no1admin.pojo.dto.album.AlbumEditDTO;
import com.example.no1admin.pojo.entity.Album;
import com.example.no1admin.pojo.vo.album.AlbumDetailVO;
import com.example.no1admin.pojo.vo.album.AlbumListItemVO;
import com.example.no1admin.service.IAlbumService;
import com.example.no1admin.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class AlbumServiceImpl implements IAlbumService {

    @Autowired
    AlbumMapper albumMapper;

    public AlbumServiceImpl() {
        log.debug("创建业务逻辑对象：AlbumServiceImpl");
    }

    @Override
    public void addNew(AlbumAddNewDTO albumAddNewDTO) {
        log.debug("准备开始处理创建相册的业务，参数：{}",albumAddNewDTO);
        //根据相册名称判断相册是否存在
        String name = albumAddNewDTO.getName();
        int count = albumMapper.countByName(name);
        if(count > 0){
            String message = "创建相册失败，相册名称【"+name+"】已经存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }

        //创建实体对象(mapper的方法参数是实体类型)
        Album album = new Album();
        //将当前方法参数的值复制到Brand实体类型的对象中
        BeanUtils.copyProperties(albumAddNewDTO,album);
        //补全属性值(不由客户端提交的属性的值，应该在插入之前补全)

        //将相册数据写入到数据库
        log.debug("即将向表中插入数据：{}",album);
        int rows = albumMapper.insert(album);
        if(rows!=1){
            String message = "创建相册失败，服务器忙，请稍后再试!";
            log.error(message);
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }

    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始处理删除相册的业务,id={}",id);
        AlbumDetailVO album = albumMapper.getById(id);
        if(album==null){
            String message = "删除相册失败，尝试删除的数据【"+id+"】不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }

        //判断是否与其他数据绑定 如绑定不能删除

        int rows = albumMapper.deleteById(id);
        if(rows!=1){
            String message = "删除相册失败，服务器忙，请稍后再试!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
    }

    @Override
    public void updateById(AlbumEditDTO albumEditDTO) {
        //将相册数据写入到数据库
        log.debug("即将向表中插入需要修改的数据：{}",albumEditDTO);

        //查询数据是否存在
        AlbumDetailVO albumDetailVO = albumMapper.getById(albumEditDTO.getId());
        if(albumDetailVO==null){
            String message = "修改摄影师失败，尝试修改的数据【"+albumEditDTO.getName()+"】不存在！";
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        //判断是否与其他数据绑定(暂未确定是否判断)
        Album album = new Album();
        BeanUtils.copyProperties(albumEditDTO,album);
        int rows = albumMapper.updateById(album);
        if(rows!=1){
            String message = "修改相册失败，服务器忙，请稍后再试!";
            log.error(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
    }

    @Override
    public List<AlbumListItemVO> list() {
        log.debug("开始处理查询相册列表的请求");
        return albumMapper.list();
    }

    @Override
    public List<AlbumListItemVO> listByName(String name) {
        log.debug("开始处理根据名字查询相册列表的请求");
        return albumMapper.listByName(name);
    }
}
